package nuaa.controller;

import nuaa.domain.Collection;
import nuaa.domain.Evaluation;
import nuaa.domain.Group;
import nuaa.domain.OrdinaryUser;
import nuaa.domain.vo.MessageModel;
import nuaa.service.EvaluationService;
import nuaa.service.UserService;
import nuaa.util.UtilUser;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@Controller
@RequestMapping("/user")
public class UserController {

    /*实例化UserService对象*/
    private UserService userService=new UserService();
    /*EvaluationService对象*/
    private EvaluationService evaluationService=new EvaluationService();

    public UserController() throws IOException {
    }

    /**
     * 用户登录
     * @return
     */
    @RequestMapping("/login")
    public void login(OrdinaryUser ouser, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        //1.接收客户端的请求（接收参数：邮箱、密码）
        //可以省略，因为可以自动注入到参数中
        //2.调用service层的方法，返回消息模型对象
        MessageModel messageModel = userService.userLogin(ouser);
        //3.判断消息状态码
        if (messageModel.getCode()==1){ //成功
            //将消息模型中的用户信息设置到session作用域中，重定向到index.jsp。
            //使用更为普遍的名称，即user
            request.getSession().setAttribute("user",messageModel.getObject());
            //将当前的对象设置到全局中
            UtilUser.setUser((OrdinaryUser)messageModel.getObject());
            //重定向到首页
            response.sendRedirect("/index.jsp");
        }else{
            //将消息模型对象设置到request作用域中，请求转发到login.jsp
            request.setAttribute("messageModel",messageModel);
            //使用这个的时候，默认前提是 /user。前面加上一个 /，便可以了。
            request.getRequestDispatcher("/WEB-INF/pages/login.jsp").forward(request,response);
        }
    }

    /**
     * 注册
     * @param ouser
     * @param request
     * @param response
     * @throws IOException
     * @throws ServletException
     */
    @RequestMapping("/register")
    public void register(OrdinaryUser ouser,HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        //1.自动注入到 ouser对象中了，不需要额外操作
        //2.调用service层的方法，返回消息模型对象
        MessageModel messageModel = userService.userRegister(ouser);

        //3.判断消息状态码
        if (messageModel.getCode()==1){ //成功
            //将消息模型中的用户信息设置到session作用域中，重定向到index.jsp。
            //使用更为普遍的名称，即user
            request.getSession().setAttribute("user",messageModel.getObject());
            //使用这个的时候，默认前提是 /user。前面加上一个 /，便可以了。
            response.sendRedirect("/index.jsp");
        }else{
            //将消息模型对象设置到request作用域中，请求转发到register.jsp
            request.setAttribute("messageModel",messageModel);
            //使用这个的时候，默认前提是 /user。前面加上一个 /，便可以了。
            request.getRequestDispatcher("/WEB-INF/pages/register.jsp").forward(request,response);
        }
    }

    /**
     * 为展示个人资料页面做准备
     * @return
     */
    @RequestMapping("/personalInfo")
    public String personalInfo(){
        /*try 是否能够到达这里*/
        return "personalInformation";
    }

    /**
     * 为展示个人分数页面做准备
     * @return
     */
    @RequestMapping("/personalScore")
    public String personalScore(HttpServletRequest request){
        //1.获取当前用户的id
        OrdinaryUser user = (OrdinaryUser) request.getSession().getAttribute("user");
        Integer userId = user.getUserId();
        //调用service方法，获取分数
        Double score=evaluationService.findScoreByUserId(userId);
        //分数放到request域中
        request.setAttribute("score",score);
        return "personalInformation";
    }

    /**
     * 为展示我的评价页面做准备
     * @return
     */
    @RequestMapping("/personalEvaluation")
    public String personalEvaluation(HttpServletRequest request) throws IOException {
        //将两种数据都注入到request域中
        //0.获取当前用户的id
        OrdinaryUser user = (OrdinaryUser) request.getSession().getAttribute("user");
        Integer userId = user.getUserId();
        //1.获取自己对别人的评价
        List<Evaluation> myEvaluations = evaluationService.findAllUserToTheOther(userId);
        //2.获取别人对自己的评价
        List<Evaluation> otherEvaluations = evaluationService.findAllTheOtherToUser(userId);
        //3.放到request域中
        request.setAttribute("myEvaluations",myEvaluations);
        request.setAttribute("otherEvaluations",otherEvaluations);
        return "personalInformation";
    }

    /**
     * 为展示出游历史页面做准备
     * @return
     */
    @RequestMapping("/personalHistory")
    public String personalHistory(HttpServletRequest request,HttpServletResponse response) throws IOException {
        //1.查找参与过的所有的队伍
        List<Group> groups=userService.findAllGroups(request);
        //2.放到request域中
        request.setAttribute("groups",groups);
        return "personalInformation";
    }

    /**
     * 为展示收藏页面做准备
     * @return
     */
    @RequestMapping("/personalCollection")
    public String personalCollection(HttpServletRequest request,HttpServletResponse response) throws IOException {
        //1.获取当前用户的Id
        OrdinaryUser user = (OrdinaryUser) request.getSession().getAttribute("user");
        Integer userId = user.getUserId();
        //2.传入当前用户的userId，找到所有的收藏对象
        List<Collection> collections = userService.findAllCollectionsByUserId(userId);
        //3.将收藏对象放到request域中
        request.setAttribute("collections",collections);
        return "personalInformation";
    }

    /**
     * 保存新的用户信息
     * @param user
     * @throws IOException
     */
    @RequestMapping("/saveNewInfo")
    public void saveNewInfo(OrdinaryUser user) throws IOException {
        //调用service更新数据
        userService.saveNewInfo(user);
    }

    /**
     * 修改密码
     * @param password
     */
    @RequestMapping("/updatePassword")
    public String updatePassword(String password) throws IOException {
        //获取当前对象Id
        System.out.println("password: "+password);
        Integer userId = UtilUser.getUser().getUserId();
        //直接修改
        userService.updatePassword(password,userId);
        //输出结果
        System.out.println("密码修改成功");

        //返回到登录页面
        return "/login";
    }
}
